////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVER_H_
#define _SERVER_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVERENGINE_H_
#include "serverengine.h"
#endif

#ifndef _SERVERNETWORK_H_
#include "servernetwork.h"
#endif

#ifndef _COMMONTYPES_H_
#include "commontypes.h"
#endif

////////////////////////////////////////////////////////////////////////////////

class ClientPacketOnServer;
class ServerPacketOnServer;

////////////////////////////////////////////////////////////////////////////////


/** This class represents game server
*   It manipulates server's engine, network and synchronizes them
*
*  @author   Roman Pasechnik
*  @since    Jun 23th, 2009
*  @updated  Oct 29th, 2009
*/
class Server
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    Server();


    /** Destructor */
    ~Server();


////////////////////////////////////////////////////////////////////////////////


    /** Start server */
    void Start();


    /** Send server packet */
    void Send( const ServerPacketOnServer* _packet );


    /** Process packet from client */
    void Receive( const ClientPacketOnServer* _packet );


    /** Disconnect client */
    void Disconnect( int _clientID );


////////////////////////////////////////////////////////////////////////////////

private:    

////////////////////////////////////////////////////////////////////////////////


    /** Server engine */
    ServerEngine m_Engine;


    /** Server network */
    ServerNetwork m_Network;


////////////////////////////////////////////////////////////////////////////////


    /** Game loop */
    void RunGameLoop();


    /** Process game logic */
    void ProcessLogic();


    /** Sends network packets to clients */
    void NotifyClients();


    /** Puts a server to sleep for a while */
    void Sleep();


    /** If its time, than do it */
    bool IsItTimeToSendAState() const;


    /** Send server state to all clients */
    void SendStateToAllClients( const ServerState& _state );


    /** Get IDs of all clients (state will be sent to them) */
    IntVec GetClientIDs() const;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

